package com.hskj.springboot.Controller;

import com.hskj.springboot.util.CodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Duration;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
public class CoderController {

    @Autowired
    RedisTemplate redisTemplate;


    // 生成验证码，并给他存入到redis
    @PostMapping("/sendCode")
    public Map<String,Object> sendCode(String phone_no){
        //返回的map
        Map<String, Object> map = new HashMap<>();

        //判断是否为空或null
        if(phone_no==null||"".equals(phone_no)){
            map.put("success", false);
            return  map;
        }

        // 生成验证码
        String code = CodeUtil.generateVerifyCode(4);
        System.out.println("code = " + code);

        //定义key
        String codeKey = phone_no + ":" + code;

        //获取次数
        String countKey = phone_no;
        Integer count = (Integer) redisTemplate.opsForValue().get(countKey);
        if (count ==null){
            //说明是第一次,把当天剩余的秒数，设置到redis中
            //获取当天剩余的时间
            long theLeftSeconds = getTheLeftSeconds();
            redisTemplate.opsForValue().set(countKey,1,(int)theLeftSeconds,TimeUnit.SECONDS);
        } else if (count ==3) {
            map.put("limit","limit");
            return map;
        }else {
            redisTemplate.opsForValue().increment(countKey);
        }

        // 将验证码存储到redis中,并设置过期时间
        redisTemplate.opsForValue().set(codeKey, code,2, TimeUnit.MINUTES);

        map.put("success", true);
        return map;
    }
    ///////////////////////////////////////////////////////////////////////////////////////
//获取当天剩余秒数的方法
    private long getTheLeftSeconds(){
        //获取现在的时间
        LocalTime now = LocalTime.now();
        //获取当日23点59分59秒的时间
        LocalTime end = LocalTime.of(23, 59, 59);
        //获取end与now相差的秒数
        long millis = Duration.between(now, end).toMillis()/1000;
        return millis;
    }

    // 检验验证码
    @PostMapping("/checkCode")
    public Map<String,Object> checkCodeServlet(String phone_no,String verify_code){
        Map<String, Object> map = new HashMap<>();
        // 判断手机号和输入的验证码是否为空
        if (phone_no == null || verify_code == null || "".equals(phone_no)|| "".equals(verify_code)){
            map.put("success", false);
            return map;
        }
        // 获取redis中的验证码
        String codeKey = phone_no + ":" + verify_code;
        String redisCode = (String) redisTemplate.opsForValue().get(codeKey);

        //redisCode等于空时
        if(redisCode==null||redisCode==""){
            map.put("success", false);
            return map;
        }

        // 判断redis中的和输入的验证码是否一样
        if (redisCode.equals(verify_code)) {
            // 删除验证码
            redisTemplate.delete(codeKey);
            map.put("success", true);
            return map;
        }

        return map;
    }

    // 生成验证码
//    @PostMapping("/sendCodeServlet")
//    public Map<String,Object> sendCodeServlet(String phone_no){
//        Map<String, Object> map = new HashMap<>();
//        // 记录发送验证码的次数
//        String countKey = phone_no;
//        Integer count = (Integer) redisTemplate.opsForValue().get(countKey);
//        System.out.println(count);
//        if (count == null) {
//            // 证明是第一次发送，向Redis中设置一个计数器，默认值为1,有效时间为当日剩余的秒数
//            long theLeftSeconds = getTheLeftSeconds();
//            redisTemplate.opsForValue().set(countKey,1,(int)theLeftSeconds,TimeUnit.SECONDS);
//        }else if(3 == count){
//            map.put("count", false);
//            return map;
//        } else{
//            redisTemplate.opsForValue().increment(countKey);
//        }
//
//        // 生成验证码
//        String code = CodeUtil.generateVerifyCode(4);
//
//        // 将验证码存储到redis中,并设置过期时间
//        String codeKey = phone_no + ":code";
//        redisTemplate.opsForValue().set(codeKey, code,2, TimeUnit.MINUTES);
//
//
//        map.put("success", true);
//        return map;
//    }
//    ///////////////////////////////////////////////////////////////////////////////////////
////获取当天剩余秒数的方法
//    private long getTheLeftSeconds(){
//        //获取现在的时间
//        LocalTime now = LocalTime.now();
//        //获取当日23点59分59秒的时间
//        LocalTime end = LocalTime.of(23, 59, 59);
//        //获取end与now相差的秒数
//        long millis = Duration.between(now, end).toMillis()/1000;
//        return millis;
//    }
}